const express = require("express");
const cors = require("cors");
const app = express();
const router = require("./router");
const port = 3000;
const jwt = require("jsonwebtoken");
const { UUID } = require("./core/contains");
const { User } = require("./models");

// 配置解析 POST 请求体, 他会把解析到的数据挂载到 req.body 上
app.use(express.json());

// 给 http 接口提供 cors 跨域处理
app.use(cors());

// 挂载路由
app.use("/api", router);

const http = require("http");

const server = http.createServer(app);
const { Server } = require("socket.io");
const io = new Server(server, {
  cors: {
    origin: "*",
  },
});

// socket 通信的中间件
io.use((socket, next) => {
  // 获取token
  const token = socket.handshake.auth.token;
  // 验证token 是否合理
  jwt.verify(token, UUID, async (err, data) => {
    if (err) {
      // 没有登录状态，返回失败信息
      return next(new Error("身份认证失败"));
    }
    const user = await User.findById(data.userId);
    // 将查到的用户挂载到 request 请求对象中，给后面的处理使用
    socket.request.user = user;
    next();
  });
});

// 处理 HTTP 协议的使用 Express 的实例 app
app.get("/", (req, res) => {
  res.sendFile(__dirname + "/index.html");
});

// 处理 websocket 协议的使用 socket.io 的实例 io
io.on("connection", (socket) => {
  socket.on("chat message", (message) => {
    // 返回信息
    io.emit("chat message", {
      username: socket.request.user.username,
      message,
    });
  });
});

server.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});
